﻿#region License
/*

	Copyright (C) 2008 Oliver Charles, Daniel Hollander

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
	
*/
#endregion

using System;

namespace Moebius.Controllers
{
	public delegate TResult Func<TResult>();
	
    /// <summary>
    /// Represents the basics of a <see cref="Controller"/> that can manipulate any variables.
    /// </summary>
    public abstract class LambdaController<TVariableType> : Controller
    {
        private Action<TVariableType> setter;
        private Func<TVariableType> getter;

        /// <summary>
        /// Gets the "Getter" function, for the variable being controlled.
        /// </summary>
        protected Func<TVariableType> Get
        {
            get { return getter; }
        }

        /// <summary>
        /// Sets the value of the variable being controlled.
        /// </summary>
        protected Action<TVariableType> Set
        {
            get { return setter; }
        }

        /// <summary>
        /// Bind a specific variable to this controller.
        /// </summary>
        /// <param name="newSetter">A method to set the value of the variable.</param>
        /// <param name="newGetter">A method to get the value of the variable.</param>
        public void Bind(Action<TVariableType> newSetter, Func<TVariableType> newGetter)
        {
            if (newSetter == null) throw new ArgumentNullException("newSetter");
            if (newGetter == null) throw new ArgumentNullException("newGetter");

            setter = newSetter;
            getter = newGetter;
        }

        /// <summary>
        /// Unbinds this controller
        /// </summary>
        public override void Unbind()
        {
            setter = null;
            getter = null;
        }
    }
}